//
//  FlowLayout.m
//  LZCollectionView
//
//  Created by apple on 16/3/29.
//  Copyright © 2016年 m14a.cn. All rights reserved.
//

#import "FlowLayout.h"

/*
 每次滚动,需要计算下缩放比例,给cell做形变
 距离中心点距离越近,值越小,缩放越大 值越大,缩放越小
 获取显示cell,进行缩放
 */


@implementation FlowLayout

// Invalidate:刷新
// 在滚动时候是否刷新布局
- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds{
    
    return YES;
}

// 返回cell布局
// 获取cell布局,直接操作cell尺寸
// 作用:指定一段区域,就能返回这个区域内所有cell布局
// 可以一次性返回所有cell布局
- (nullable NSArray<__kindof UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect{
    
    // 获取显示区域
    // 1.获取一堆显示cell的布局 数组，数组里面装的都是cell的布局
    NSArray *atts = [super layoutAttributesForElementsInRect:self.collectionView.bounds];
    // 2.拿到collectionView的宽度
    CGFloat w = self.collectionView.bounds.size.width;
    // 3.拿到collectionView.contentOffset.x的偏移量
    CGFloat offsetX = self.collectionView.contentOffset.x;
    
    for (UICollectionViewLayoutAttributes *att in atts) {
        // 获取中心点距离,某个item的中心点 - (collectionView的宽度的一半 + collectionView.contentOffset.x的偏移量)
        // 该值最大为collectionView的宽度的一半
        CGFloat delta = fabs(att.center.x - (w * 0.5 + offsetX));
        // 获取缩放比例
        CGFloat scale = 1 - delta / (w * 0.5) * 0.25;
        
        att.transform = CGAffineTransformMakeScale(scale, scale);
    }
    
    return atts;
    
}


// 作用: 返回最终偏移量
// 调用时刻:当用户手指抬起,拖动完成的时候就会调用
- (CGPoint)targetContentOffsetForProposedContentOffset:(CGPoint)proposedContentOffset withScrollingVelocity:(CGPoint)velocity{
    
    // 1.拿到collectionView的宽度
    CGFloat w = self.collectionView.bounds.size.width;
    // 2.获取最终显示区域
    CGRect targetR = CGRectMake(proposedContentOffset.x, 0, w, MAXFLOAT);
    // 3.获取最终显示cell
    NSArray *atts = [super layoutAttributesForElementsInRect:targetR];
    
    // 获取cell离中心点距离,越近cell居中显示
    CGFloat minDelta = MAXFLOAT;
    for (UICollectionViewLayoutAttributes *att in atts) {
        // 获取中心点距离
        CGFloat delta = att.center.x - (w * 0.5 + proposedContentOffset.x);
        
        if (fabs(delta) < fabs(minDelta)) {
            minDelta = delta;
        }
        
    }
    
    proposedContentOffset.x += minDelta;
    
    if (proposedContentOffset.x < 0) {
        proposedContentOffset.x = 0;
    }
    
    return proposedContentOffset;

    /*
    CGPoint targetP = [super targetContentOffsetForProposedContentOffset:proposedContentOffset withScrollingVelocity:velocity];
    
    // 获取collectionView偏移量
    NSLog(@"%@---%@",NSStringFromCGPoint(targetP),NSStringFromCGPoint(self.collectionView.contentOffset));
    
    return targetP;
     */
}


@end
